package com.fsds.crem.core.feature.orm.mybatis;

import java.util.ArrayList;
import java.util.List;
import org.apache.ibatis.session.RowBounds;

/**
 * Mybatis分页参数及查询结果封装. 注意所有序号从1开始.
 * 
 * <pre>
 * 历史记录：
 * 2016-3-3 Dean
 * 	新建文件
 * </pre>
 * 
 * @author 
 * <pre>
 * SD
 * 
 * PG
 * 	dean
 * UT
 *
 * MA
 * </pre>
 * @version 1.0
 *
 * <p/> $Id$
 *
 * @param <T> Page中记录的类型
 */
public class Page<T> extends RowBounds {

	// ~ Static Fields
	// ==================================================

	// ~ Fields
	// ==================================================
	protected int pageNo = 1; // 页编号 : 第几页
	protected int pageSize = 10; // 页大小 : 每页的数量
	protected int offset; // 偏移量 : 第一条数据在表中的位置
	protected int limit; // 限定数 : 每页的数量
	protected List<T> result = new ArrayList<T>(); // 查询结果
	protected int totalCount; // 总条数
	protected int totalPages; // 总页数

	// ~ Constructors
	// ==================================================

	public Page() {

		this.calcOffset();
		this.calcLimit();
	}

	public Page(int pageNo) {

		this.pageNo = pageNo;
		this.calcOffset();
		this.calcLimit();
	}

	// ~ Methods
	// ==================================================

	// --计算 数据库 查询的参数 : LIMIT 3, 3; LIMIT offset, limit; --//
	/**
	 * <pre>
	 * 2016-3-3 Dean
	 * 	计算偏移量
	 * </pre>
	 * 
	 */
	private void calcOffset() {

		this.offset = ((pageNo - 1) * pageSize);
	}

	/**
	 * <pre>
	 * 2016-3-3 Dean
	 * 	计算限定数
	 * </pre>
	 * 
	 */
	private void calcLimit() {

		this.limit = pageSize;
	}

	/**
	 * <pre>
	 * 2016-3-3 Dean
	 * 	根据pageNo和pageSize计算当前页第一条记录在总结果集中的位置,序号从1开始.
	 * </pre>
	 * 
	 * @return
	 */
	public int getFirst() {

		return ((pageNo - 1) * pageSize) + 1;
	}

	/**
	 * <pre>
	 * 2016-3-3 Dean
	 * 	设置总记录数.
	 * </pre>
	 * 
	 * @param totalCount
	 */
	public void setTotalCount(final int totalCount) {

		this.totalCount = totalCount;
		this.totalPages = this.getTotalPages();
	}

	/**
	 * <pre>
	 * 2016-3-3 Dean
	 * 	根据pageSize与totalCount计算总页数, 默认值为-1.
	 * </pre>
	 * 
	 * @return
	 */
	public int getTotalPages() {

		if (totalCount < 0) {

			return -1;
		}

		int pages = totalCount / pageSize;
		return totalCount % pageSize > 0 ? ++pages : pages;
	}

	/**
	 * <pre>
	 * 2016-3-3 Dean
	 * 	获得下一页页码
	 * </pre>
	 * 
	 * @return
	 */
	public int getNextPageNo() {

		return (pageNo + 1) > totalPages ? totalPages : (pageNo + 1);
	}

	/**
	 * <pre>
	 * 2016-3-3 Dean
	 * 	获得上一页页码
	 * </pre>
	 * 
	 * @return
	 */
	public int getPreviousPageNo() {

		return pageNo == 1 ? 1 : (pageNo - 1);
	}

	public int getPageNo() {

		return pageNo;
	}

	public int getPageSize() {

		return pageSize;
	}

	public int getOffset() {

		return offset;
	}

	public int getLimit() {

		return limit;
	}

	public List<T> getResult() {

		return result;
	}

	public void setResult(final List<T> result) {

		this.result = result;
	}

	public int getTotalCount() {

		return totalCount;
	}

	public void setTotalPages(int totalPages) {

		this.totalPages = totalPages;
	}
}
